// run

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Test struct-valued variables (not pointers).

package main

type x2 struct {
	a, b, c int
	d       int
}

var g1 x2
var g2 struct {
	a, b, c int
	d       x2
}

func main() {
	var x int
	var s1 *x2
	var s2 *struct {
		a, b, c int
		d       x2
	}
	var s3 struct {
		a, b, c int
		d       x2
	}

	s1 = &g1
	s2 = &g2

	s1.a = 1
	s1.b = 2
	s1.c = 3
	s1.d = 5

	if s1.c != 3 {
		panic(s1.c)
	}
	if g1.c != 3 {
		panic(g1.c)
	}

	s2.a = 7
	s2.b = 11
	s2.c = 13
	s2.d.a = 17
	s2.d.b = 19
	s2.d.c = 23
	s2.d.d = 29

	if s2.d.c != 23 {
		panic(s2.d.c)
	}
	if g2.d.c != 23 {
		panic(g2.d.c)
	}

	x = s1.a +
		s1.b +
		s1.c +
		s1.d +

		s2.a +
		s2.b +
		s2.c +
		s2.d.a +
		s2.d.b +
		s2.d.c +
		s2.d.d

	if x != 130 {
		panic(x)
	}

	// test an automatic struct
	s3.a = 7
	s3.b = 11
	s3.c = 13
	s3.d.a = 17
	s3.d.b = 19
	s3.d.c = 23
	s3.d.d = 29

	if s3.d.c != 23 {
		panic(s3.d.c)
	}

	x = s3.a +
		s3.b +
		s3.c +
		s3.d.a +
		s3.d.b +
		s3.d.c +
		s3.d.d

	if x != 119 {
		panic(x)
	}
}
